﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using SST_BL;
using System.Data;

namespace TCU
{
    public partial class ManejoPersonalDeSoporte : System.Web.UI.Page
    {
        protected void Page_Load(object sender, EventArgs e)
        {

            if(!IsPostBack){
                if (!MainBL.RevisarConexionBaseDatos())                
                    Server.Transfer("NoConexion.aspx");                
                if (!MainBL.ExistenCircuitosEnBD())
                {
                    notificacion.Text = "No existen Circuitos en el sistema, presiona <a href='ManejoCircuito.aspx'>aqui</a> para agregar Circuitos en el sistema!";
                    listInformaticos.Visible = false;
                    RevisarPermisos.Visible = false;
                }
                else {                    
                        string user = Request.ServerVariables["REMOTE_USER"].ToString();
                        bool IsCoordinador = MainBL.IsCoordinadorTI(user.Substring(user.IndexOf("\\") + 1));
                        bool IsAdmin = MainBL.RevisarPermiso(user.Substring(user.IndexOf("\\") + 1), "Administrador");
                        if (IsAdmin || IsCoordinador)
                        {
                            this.CargarHabilidades();
                            int CircuitoID = MainBL.GetCircuitoInformatico(user.Substring(user.IndexOf("\\") + 1))[0];
                            SqlDataSource sqldt = new SqlDataSource();
                            sqldt.ConnectionString = System.Configuration.ConfigurationManager.ConnectionStrings["SSTConnectionString"].ToString();
                            if (IsAdmin)
                            {
                                sqldt.SelectCommand = "SELECT DISTINCT i.InformaticoID, i.NombreCompleto FROM Informatico as i"
                                                        + " INNER JOIN RolInformatico as ri ON i.InformaticoID=ri.InformaticoID "
                                                        + " INNER JOIN Rol as r ON r.RolID=ri.RolID"
                                                        + " INNER JOIN InformaticoCircuito as ic ON i.InformaticoID=ic.InformaticoID"
                                                        + " WHERE i.FechaBorrado IS NULL"
                                                        + " AND r.NombreRol='Personal de Soporte'";
                            }
                            else if (IsCoordinador)
                            {
                                sqldt.SelectCommand = "SELECT DISTINCT i.InformaticoID, i.NombreCompleto FROM Informatico as i"
                                                    + " INNER JOIN RolInformatico as ri ON i.InformaticoID=ri.InformaticoID "
                                                    + " INNER JOIN Rol as r ON r.RolID=ri.RolID"
                                                    + " INNER JOIN InformaticoCircuito as ic ON i.InformaticoID=ic.InformaticoID"
                                                    + " WHERE i.FechaBorrado IS NULL"
                                                    + " AND r.NombreRol='Personal de Soporte'"
                                                    + " AND ic.CircuitoID =" + CircuitoID;
                            }
                            listInformaticos.DataSource = sqldt;
                            listInformaticos.DataTextField = "NombreCompleto";
                            listInformaticos.DataValueField = "InformaticoID";
                            listInformaticos.DataBind();
                        }
                        else
                        {
                            Server.Transfer("NoAccess.aspx");
                        }
                }//if (!MainBL.ExistenCircuitosEnBD())            
            }//if(!IsPostBack){
            if (listInformaticos.SelectedValue.ToString().Equals(""))
            {
                DataTable dt = new DataTable();
                dt.Columns.Add("Nombre", typeof(string));
                dt.Rows.Add("No hay ningun informatico...");
                HabilidadesInformaticoGV.AutoGenerateDeleteButton = false;
            }
            else
            {
                HabilidadesInformaticoGV.AutoGenerateDeleteButton = true;
            }//if (listInformaticos.SelectedValue.ToString().Equals(""))
        }//protected void Page_Load(object sender, EventArgs e)
     
        /// <summary>
        /// Esta funcion carga las habilidades en base al usuario seleccionado en el ListBox.
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        protected void RevisarPermisos_Command(object sender, CommandEventArgs e)
        {
            CargarHabilidadesDeInformatico();
        }

        /// <summary>
        /// Carga todas las habilidades existentes, este es un modulo de administrador. 
        /// </summary>
        private void CargarHabilidades() {
            DataTable dt = MainBL.ListarHabilidades();
            if (dt == null || dt.Rows.Count == 0)
            {
                dt = new DataTable();
                dt.Columns.Add("ID", typeof(int));
                dt.Columns.Add("Nombre", typeof(string));
                dt.Columns.Add("Circuito", typeof(string));
                dt.Rows.Add(0, "No hay ningun informatico...");
                HabilidadesGV.AutoGenerateDeleteButton = false;
                HabilidadesGV.AutoGenerateEditButton = false;
            }
            else
            {
                HabilidadesGV.AutoGenerateDeleteButton = true;
                HabilidadesGV.AutoGenerateEditButton = true;
            }//if(dt == null){
            HabilidadesGV.DataSource = dt;
            HabilidadesGV.DataBind();
        }

        private void CargarHabilidadesDeInformatico() {
            if (listInformaticos.SelectedValue == "" || listInformaticos.SelectedValue == null)
            {
                notificacion.Text = "Debes de seleccionar un informatico!";
                notificacion.ForeColor = System.Drawing.Color.Red;
            }
            else {
                DataTable dt = MainBL.GetHabilidadesDeInformatico(int.Parse(listInformaticos.SelectedValue.ToString()));
                if (dt == null || dt.Rows.Count == 0)
                {
                    dt = new DataTable();
                    dt.Columns.Add("NombreHabilidad", typeof(string));
                    dt.Rows.Add("Este Informatico NO tiene habilidades asignadas...");
                    HabilidadesInformaticoGV.AutoGenerateDeleteButton = false;
                }
                else
                {
                    HabilidadesInformaticoGV.AutoGenerateDeleteButton = true;
                }//if(dt == null){

                lblInformaticoNombre.Text = listInformaticos.SelectedValue.ToString();


                if (dt != null)
                {
                    HabilidadesInformaticoGV.DataSource = dt;
                    HabilidadesInformaticoGV.DataBind();
                }

                string user = Request.ServerVariables["REMOTE_USER"].ToString();
                DataTable HabilidadesDelCircuito = null;
                //if (MainBL.RevisarPermiso(user.Substring(user.IndexOf("\\") + 1), "Administrador"))
                //{
                //    HabilidadesDelCircuito = MainBL.ListarHabilidades();
                //}
                //else {
                HabilidadesDelCircuito = MainBL.HabilidadesPorCircuitoEnBaseAUsuario(int.Parse(lblInformaticoNombre.Text));
                //}
                if (HabilidadesDelCircuito != null) {
                    DropDownList drop = HabilidadesInformaticoGV.FooterRow.FindControl("DropAgregarHabilidad") as DropDownList;
                    for (int i = 0; i < HabilidadesDelCircuito.Rows.Count; i++)
                    {
                        drop.Items.Add(new ListItem(HabilidadesDelCircuito.Rows[i].ItemArray[1].ToString(), HabilidadesDelCircuito.Rows[i].ItemArray[0].ToString()));
                    }//for (int i = 0; i < HabilidadesDelCircuito.Rows.Count; i++) { 
                }
                
                lblDatosInformatico.Text = "Habilidades del Informatico: <b>" + listInformaticos.SelectedItem.Text + "</b>";
            }
        }

        protected void HabilidadesInformaticoGV_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            if (e.CommandName.Equals("AgregarHabilidadInformatico"))
            {
                notificacion.ForeColor = System.Drawing.Color.Red;
                GridViewRow gvr = (GridViewRow)(((LinkButton)e.CommandSource).NamingContainer);
                DropDownList dropHabilidad = (DropDownList)(gvr.FindControl("DropAgregarHabilidad"));
                if (!MainBL.InformaticoTieneHabilidad(lblInformaticoNombre.Text ,dropHabilidad.SelectedValue.ToString()))
                {
                    if (MainBL.AgregarHabilidadAInformatico(int.Parse(lblInformaticoNombre.Text), int.Parse(dropHabilidad.SelectedValue.ToString())))
                    {
                        notificacion.Text = "El informatico "+lblInformaticoNombre.Text+" ahora tiene la habilidad "+dropHabilidad.SelectedValue.ToString();
                        notificacion.ForeColor = System.Drawing.Color.Green;
                        CargarHabilidadesDeInformatico();
                    }
                    else {
                        notificacion.Text = "Ocurrio un error a la hora de agregar la hablidad!";
                    }
                }
                else {
                    notificacion.Text = "El informatico ya tiene esta habilidad.";
                }
            }//if (e.CommandName.Equals("AgregarHabilidadInformatico")) { 
        }

        protected void HabilidadesGV_RowCommand(object sender, GridViewCommandEventArgs e)
        {
            notificacion.ForeColor = System.Drawing.Color.Red;
            if (e.CommandName.Equals("Agregar"))
            {
                GridViewRow gvr = (GridViewRow) (((LinkButton)e.CommandSource).NamingContainer);
                TextBox txtNombre = ((TextBox)gvr.FindControl("TxtNombreHabilidad"));
                DropDownList dropNombreCircuito = ((DropDownList)gvr.FindControl("dropNombreCircuito"));
                if (!txtNombre.Text.Equals("") && !dropNombreCircuito.SelectedValue.Equals(""))
                {
                    if (!MainBL.ExisteHabilidad(txtNombre.Text, int.Parse(dropNombreCircuito.SelectedValue.ToString())))
                    {
                        if (MainBL.AgregarHabilidad(txtNombre.Text, int.Parse(dropNombreCircuito.SelectedValue.ToString())))
                        {
                            notificacion.Text = "La habilidad fue agregada exitosamente!";
                            notificacion.ForeColor = System.Drawing.Color.Green;
                            CargarHabilidades();
                            if(listInformaticos.SelectedIndex != -1)
                                CargarHabilidadesDeInformatico();
                        }
                        else ////if (MainBL.AgregarHabilidad(txtNombre.Text))
                        {
                            notificacion.Text = "No se pudo agregar la habilidad!";
                        }//if (MainBL.AgregarHabilidad(txtNombre.Text))
                    }
                    else
                    {
                        notificacion.Text = "Ya existe una habilidad con ese nombre, favor seleccionar otro nombre!";
                    }
                }
                else {
                    notificacion.Text = "Debes de incluir un nombre para la habilidad!";
                }//if (txtNombre.Text.Equals(""))        
            }//if (e.CommandName.Equals("AgregarHabilidadInformatico")) { 
        }

        protected void HabilidadesGV_RowEditing(object sender, GridViewEditEventArgs e)
        {
            HabilidadesGV.EditIndex = e.NewEditIndex;
            this.CargarHabilidades();
            Label lbID = HabilidadesGV.Rows[e.NewEditIndex].FindControl("lblEditID") as Label;
            DropDownList list = (DropDownList)HabilidadesGV.Rows[e.NewEditIndex].FindControl("dropNombreCircuito");
            int HabilidadCircuitoID = MainBL.GetCircuitoHabilidad(int.Parse(lbID.Text));
            ListItem selectedListItem = list.Items.FindByValue(HabilidadCircuitoID.ToString());
            if (selectedListItem != null)
                selectedListItem.Selected = true;
            
        }

        protected void HabilidadesGV_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {
            HabilidadesGV.EditIndex = -1;
            this.CargarHabilidades();
        }

        protected void HabilidadesGV_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            notificacion.ForeColor = System.Drawing.Color.Red;
            Label id = HabilidadesGV.Rows[e.RowIndex].FindControl("lblID") as Label;
            if(MainBL.EliminarHabilidad(int.Parse(id.Text))){
                notificacion.Text = "La habilidad fue eliminada.";
                notificacion.ForeColor = System.Drawing.Color.Green;
            }else{
                notificacion.Text = "Ha ocurrido un error y la habilidad no pudo ser eliminada.";
            }
            this.CargarHabilidades();
        }

        protected void HabilidadesGV_RowUpdating(object sender, GridViewUpdateEventArgs e)
        {
            Label lbID = HabilidadesGV.Rows[e.RowIndex].FindControl("lblEditID") as Label;
            TextBox txtNombre = HabilidadesGV.Rows[e.RowIndex].FindControl("txtEditNombre") as TextBox;
            DropDownList dropCircuito = HabilidadesGV.Rows[e.RowIndex].FindControl("dropNombreCircuito") as DropDownList;
            if(txtNombre.Text.Length > 0){
                //if (!MainBL.ExisteHabilidad(txtNombre.Text))
                //{
                    if (MainBL.ModificarHabilidad(int.Parse(lbID.Text), txtNombre.Text, int.Parse(dropCircuito.SelectedValue)))
                    {
                        notificacion.ForeColor = System.Drawing.Color.Green;
                        notificacion.Text = "La habilidad a sido modificada!";
                        CargarHabilidadesDeInformatico();
                    }
                    else
                    {
                        notificacion.ForeColor = System.Drawing.Color.Red;
                        notificacion.Text = "Hubo un error, la habilidad no pudo ser modificada! ";
                    }//if (MainBL.ModificarHabilidad(int.Parse(lbID.Text), txtNombre.Text)) {
                    HabilidadesGV.EditIndex = -1;
                    this.CargarHabilidades();
                //}
                //else
                //{
                //    notificacion.Text = "Ya existe una habilidad con ese nombre!";
                //}
            }else{
                notificacion.Text = "Debes de indicar un nombre para modificar la habilidad!";
            }
        }//protected void HabilidadesGV_RowUpdating(object sender, GridViewUpdateEventArgs e)

        protected void HabilidadesInformaticoGV_RowDeleting(object sender, GridViewDeleteEventArgs e)
        {
            Label id = HabilidadesInformaticoGV.Rows[e.RowIndex].FindControl("lbNombreHabilidad") as Label;
            string NombreInformatico = lblInformaticoNombre.Text;
            if (MainBL.EliminarHabilidadDeInformatico(NombreInformatico, id.Text))
            {
                notificacion.Text = "La Habilidad del informatico fue eliminada.";
                CargarHabilidadesDeInformatico();
            }
            else{
                notificacion.Text = "La habilidad no puedo ser eliminada";
            }
            CargarHabilidadesDeInformatico();  
        }

        protected void HabilidadesInformaticoGV_RowCancelingEdit(object sender, GridViewCancelEditEventArgs e)
        {

        }//protected void HabilidadesInformaticoGV_RowDeleting(object sender, GridViewDeleteEventArgs e)

    }
}